<?php
declare (strict_types = 1);
namespace app\validate;

use think\Validate;

class Software extends Validate
{
    /**
     * 定义验证规则
     */
    protected $rule = [
        'id'        => 'require|integer',
        'ids'       => 'require|array|arrayInt',
        'name'      => 'require|max:30|chsAlphaNum|unique:software|uniqueCurrentField',
        'config'    => 'array|configField',
        'status'    => 'require|in:0,1',
    ];

    /**
     * 定义错误信息
     */
    protected $message = [
        'id.require'     => '缺少可操作数据标识',
        'id.integer'     => '提交数据格式非法',
        'ids.require'    => '缺少可操作数据标识',
        'ids.array'      => '提交数据格式非法',
        'name.require'   => '名称不能为空',
        'name.unique'    => '名称已存在',
        'name.max'       => '名称不能超过30位字符',
        'config.array'   => '配置信息格式错误',
        'status.require' => '状态不能为空',
        'status.in'      => '状态数据异常, 请刷新',
    ];

    // 搜索
    public function sceneSearch()
    {
        return $this->only(['name', 'status'])
            ->remove('name', 'require|unique|uniqueCurrentField')
            ->remove('status', 'require');
    }

    // 新增
    public function sceneAdd()
    {
        return $this->only(['name', 'config', 'status'])
            ->remove('name', 'uniqueCurrentField');
    }

    // 编辑
    public function sceneEdit()
    {
        return $this->only(['id', 'name', 'status'])
            ->remove('name', 'unique');
    }

    public function sceneDelete()
    {
        return $this->only(['ids']);
    }

    // 验证除了本条数据以外是否有已存在数据, 用于编辑
    protected function uniqueCurrentField($value, $rule, $data = [], $field)
    {
        $result = $this->db->name('software')
            ->where([
                [$field, '=', $data[$field]],
                ['id', '<>', $data['id'] ?? 0]
            ])
            ->findOrEmpty();

        return empty($result) ? true : (string) $value. "字段已存在";
    }

    // 验证上传字段是否重复
    protected function configField($value)
    {
        $count = 0;
        foreach($value as $k => $v) {
            if ($v['type'] == "file") {
                $count++;
                if($count > 1) {
                    return "上传字段不能超过1个";
                }
            }
            if(!preg_match('/^[^0-9][a-z0-9_]*$/i',$v['enname'])) {
                return "[" .$v['cnname']. "] 键名格式错误";
            }
        }

        return true;
    }

    // 验证数组键值是否为 int
    protected function arrayInt($value)
    {
        if(!is_array($value)) {
            return "数据类型不是数组";
        }
        function is_arrint($value) {
            for ($i = 0; $i < count($value); $i++) {
                if(!is_array($value[$i]) && !is_numeric($value[$i])) {
                    return "提交数据格式非法";
                } else {
                    if(is_array($value[$i])) {
                        is_arrint($value[$i]);
                    }
                }
            }
            return true;
        }
        return is_arrint($value);
    }
}
